home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 722 / 722.xpi / chrome / noscript.jar / content / noscript / iaUI.js < prev    next >
Text File  |  2010-02-12  |  5KB  |  193 lines

  1. var $ = function(id) { return document.getElementById(id); }
  2. var $$ = function(tag) { return document.getElementsByTagName(tag); }
  3.  
  4. function UIUtils(serv) {
  5.   this.serv = serv;
  6. }
  7. UIUtils.prototype = {
  8.   tabselPrefName: "options.tabSelectedIndexes",
  9.   resumeTabSelections: function() {
  10.     var info = window.arguments && window.arguments[0];
  11.     var indexes = info && info.tabselIndexes ||
  12.       this.serv.getPref(this.tabselPrefName, "").split(/\s*,\s*/);
  13.     // select tabs from external param
  14.     
  15.     var tabs = $$("tabs");
  16.     var tcount = Math.min(tabs.length, indexes.length);
  17.     var listener = function(ev) { arguments.callee.binding.persistTabSelections(); }
  18.     listener.binding = this;
  19.     for(var t = tabs.length; t-- > 0;) {
  20.       try {
  21.         tabs[t].selectedIndex = parseInt(indexes[t]) || 0;
  22.       } catch(e) {}
  23.       tabs[t].addEventListener("select", listener, false); 
  24.     }
  25.     this.persistTabSelections();
  26.     
  27.     if (info && info.callback) {
  28.       window.setTimeout(info.callback, 0);
  29.     }
  30.   },
  31.   
  32.   persistTabSelections: function() {
  33.      var tabs = $$("tabbox");
  34.      var ss = [];
  35.      for(var tcount = 0; tcount < tabs.length; tcount++) {
  36.        ss.push(tabs[tcount].selectedIndex);
  37.      }
  38.      this.serv.setPref(this.tabselPrefName, ss.join(","));
  39.   },
  40.   
  41.   visitCheckboxes: function(callback) {
  42.     const rxOpt=/^(inv|moz|)opt-(.*)/;
  43.     var j, checkbox, match;
  44.     const opts = $$("checkbox");
  45.     for(j = opts.length; j-- > 0;) {
  46.       checkbox = opts[j];
  47.       if((match = checkbox.id.match(rxOpt))) {
  48.         callback(match[2], match[1] == "inv", checkbox, match[1] == "moz");
  49.       }
  50.     }
  51.   },
  52.   
  53.   visitTextboxes: function(callback) {
  54.     const rxOpt=/^opt-(.*)/;
  55.     var j, box, match;
  56.     const opts = $$("textbox");
  57.     for(j = opts.length; j-- > 0;) {
  58.       box = opts[j];
  59.       if((match = box.id.match(rxOpt))) {
  60.         callback(match[1], box);
  61.       }
  62.     }
  63.   },
  64.   
  65.   syncGroup: function(caption) {
  66.     var b = !caption.checked;
  67.     var node = caption.parentNode;
  68.     while((node = node.nextSibling)) {
  69.       node.disabled = b;
  70.     }
  71.   },
  72.   
  73.   moveButtonsDown: function() {
  74.     var ref = document.documentElement.getButton("extra2");
  75.     Array.slice(arguments).forEach(function(s) {
  76.       var b = $(s);
  77.       b.className = ref.className;
  78.       ref.parentNode.insertBefore(b, ref);
  79.       b.hidden = false;
  80.     });
  81.   }
  82. };
  83.  
  84.  
  85. function ConditionalGroup(serv, prefName, def) {
  86.   this.serv = serv;
  87.   this.prefName = prefName;
  88.   this.cbx = $("cbx-" + prefName);
  89.   this.sel = $("sel-" + prefName);
  90.   var value = this.serv.getPref(prefName, def);
  91.   this.defaultIndex = typeof(def) == "number" ? def : 0;
  92.   this.cbx.checked =  !!value;
  93.   this.sel.selectedIndex = value ? value - 1 : def;
  94.   var instance = this;
  95.   this.cbx.conditionalGroup = this;
  96.   this.cbx.setAttribute("oncommand", "this.conditionalGroup.changed()");
  97.   this.changed();
  98. }
  99.  
  100. ConditionalGroup.prototype = {
  101.   changed: function() {
  102.     this.sel.disabled = !this.cbx.checked;
  103.     if(this.cbx.checked && this.sel.selectedIndex < 0) {
  104.       this.sel.selectedIndex = this.defaultIndex;
  105.     }
  106.   },
  107.   getValue: function() {
  108.     return this.cbx.checked && this.sel.selectedIndex + 1 || 0;
  109.   },
  110.   persist: function() {
  111.     this.serv.setPref(this.prefName, this.getValue());
  112.   }
  113. };
  114.  
  115. function SoundChooser(id, title, serv, def) {
  116.   this.id = id;
  117.   this.title = title;
  118.   this.serv = serv;
  119.   this.def = def;
  120. }
  121.  
  122. SoundChooser.prototype = {
  123.   choose: function(btn) {
  124.     try {
  125.       const cc=Components.classes;
  126.       const ci=Components.interfaces;
  127.       const fp = cc["@mozilla.org/filepicker;1"].createInstance(ci.nsIFilePicker);
  128.       
  129.       fp.init(window, this.title, ci.nsIFilePicker.modeOpen);
  130.       fp.appendFilter(this.serv.getString("audio.samples"),"*.wav");
  131.       fp.filterIndex=0;
  132.       const ret = fp.show();
  133.       if (ret == ci.nsIFilePicker.returnOK || ret==ci.nsIFilePicker.returnReplace) {
  134.         this.setSample(fp.fileURL.spec);
  135.         this.play();
  136.       }
  137.     } catch(ex) {
  138.       noscriptUtil.prompter.alert(window, this.title, ex.toString());
  139.     }
  140.   },
  141.   setSample: function(url) {
  142.     $(this.id).value = url || this.def;
  143.   },
  144.   getSample: function() {
  145.     return $(this.id).value;
  146.   },
  147.   play: function() {
  148.     this.serv.playSound(this.getSample(), true);
  149.   }
  150. };
  151.  
  152. function RegExpController(prefix, parseMethod, value) {
  153.   this.parse = parseMethod || this.parse;
  154.   this.regexp = $(prefix + "-regexp");
  155.   this.sample = $(prefix + "-sample");
  156.   var listener = function(ev) { arguments.callee.binding.feedback(); };
  157.   listener.binding = this;
  158.   this.regexp.addEventListener("input", listener, false);
  159.   this.sample.addEventListener("input", listener, false);
  160.   this.regexp.value = value;
  161.   this.feedback();
  162. }
  163.  
  164. RegExpController.prototype = {
  165.   parse: function(s) { return new RegExp(s, "g"); },
  166.   validate: function() {
  167.     const textbox = this.regexp;
  168.     try {
  169.       const rx = this.parse(textbox.value);
  170.       if(rx) {
  171.         textbox.className = "";
  172.         return rx;
  173.       }
  174.     } catch(e) {}
  175.     textbox.className = "noscript-error";
  176.     return null;
  177.   },
  178.   feedback: function() {
  179.     const rx = this.validate();
  180.     const sample = this.sample; 
  181.     if(rx && rx.test(sample.value)) {
  182.       sample.className = "";
  183.     } else {
  184.       sample.className = "noscript-error";
  185.     }
  186.     return rx;
  187.   },
  188.   getValue: function(valid) {
  189.     if(valid && !this.validate()) return null;
  190.     return this.regexp.value;
  191.   }
  192. };
  193.